home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / util / misc / replace.lha / Replace.e < prev    next >
Text File  |  1998-09-03  |  2KB  |  77 lines

  1. OPT OSVERSION=37,REG=5
  2.  
  3. MODULE    'exec/memory'
  4.  
  5. PROC main()
  6.     DEF    myargs:PTR TO LONG,rdargs,fi,fo,mem:PTR TO CHAR,length,count
  7.     DEF    out[256]:STRING
  8.     myargs:=[0,0,0,0,0]
  9.     IF rdargs:=ReadArgs('NAME/A,TO/K,REPLACE/A,WHAT,QUIET/S',myargs,NIL)
  10.         IF myargs[4]=FALSE THEN WriteF('Replace v1.0 (\s/\s)\n',myargs[2],IF myargs[3] THEN myargs[3] ELSE 'NIL')
  11.         length:=FileLength(myargs[0])
  12.         IF mem:=AllocVec(length,MEMF_PUBLIC)
  13.             IF fi:=Open(myargs[0],OLDFILE)
  14.                 Read(fi,mem,length)
  15.                 count:=xReplace(mem,myargs[2],myargs[3],length)
  16.                 IF myargs[1] THEN StrCopy(out,myargs[1]) ELSE StringF(out,'\s.new',myargs[0])
  17.                 IF fo:=Open(out,NEWFILE)
  18.                     Write(fo,mem,length)
  19.                     Close(fo)
  20.                 ELSE
  21.                     IF myargs[4]=FALSE THEN WriteF('Unable to open file: "\s"\n',out)
  22.                 ENDIF
  23.                 Close(fi)
  24.                 IF myargs[4]=FALSE THEN WriteF('Changes: \d\n',count);
  25.             ELSE
  26.                 IF myargs[4]=FALSE THEN WriteF('Unable to open file: "\s"\n',myargs[0])
  27.             ENDIF
  28.             FreeVec(mem)
  29.         ELSE
  30.             IF myargs[4]=FALSE THEN WriteF('Not Enough memory!\n')
  31.         ENDIF
  32.         FreeArgs(rdargs)
  33.     ELSE
  34.         PrintFault(IoErr(),'Replace')
  35.     ENDIF
  36. ENDPROC
  37.  
  38. PROC xReplace(mem:PTR TO CHAR,s1:PTR TO CHAR,s2:PTR TO CHAR,length)
  39.     DEF pos=0,count=0,s2l,i
  40.     WHILE pos<length
  41.         pos:=xFind(s1,mem,pos,length)
  42.         IF pos=TRUE THEN RETURN count
  43.         IF pos<length
  44.             IF s2
  45.                 s2l:=StrLen(s2)
  46.                 i:=0
  47.                 WHILE i<s2l
  48.                     mem[pos]:=s2[i]
  49.                     i++
  50.                     pos++
  51.                     IF CtrlC() THEN RETURN
  52.                 ENDWHILE
  53.                 count++
  54.             ELSE
  55.                 s2l:=StrLen(s1)
  56.                 WHILE s2l
  57.                     mem[pos]:=0
  58.                     pos++
  59.                     s2l--
  60.                 ENDWHILE
  61.                 count++
  62.             ENDIF
  63.         ENDIF
  64.         IF CtrlC() THEN RETURN
  65.     ENDWHILE
  66. ENDPROC count
  67.  
  68. PROC xFind(s1:PTR TO CHAR,mem:PTR TO CHAR,pos,length)
  69.     REPEAT
  70.         REPEAT
  71.             IF CtrlC() THEN RETURN
  72.             pos++
  73.             IF pos>length THEN RETURN TRUE
  74.         UNTIL mem[pos]=s1[0]
  75.     UNTIL StrCmp(s1,mem+pos,StrLen(s1))=TRUE
  76. ENDPROC pos
  77.